home *** CD-ROM | disk | FTP | other *** search
- program BERT;
- {$I-}
- {.$DEFINE DEBUG}
- {$APPTYPE CONSOLE}
- uses
- DrBobCGI, IniFiles, DB, DBTables, SysUtils;
-
- const
- IniFile = '.\report.ini';
-
- procedure DataSetTable(DataSet: TDataSet; NewRec: Boolean);
- { NEW RECORD - Actions: POST, CANCEL }
- { BROWSE RECORD - Actions: FIRST, PREV, NEXT, LAST, INSERT, DELETE, REFRESH }
- const
- Int: Array[1..9] of Char = '123456789';
- var
- i,j,col,items: Integer;
- option: ShortString;
- begin
- if NewRec then
- begin
- write('<INPUT TYPE=SUBMIT NAME=Action VALUE=Post>');
- write('<INPUT TYPE=SUBMIT NAME=Action VALUE=Cancel>')
- end
- else
- begin
- write('<INPUT TYPE=SUBMIT NAME=Action VALUE=First>');
- write('<INPUT TYPE=SUBMIT NAME=Action VALUE=Prev>');
- write('<INPUT TYPE=SUBMIT NAME=Action VALUE=Next>');
- write('<INPUT TYPE=SUBMIT NAME=Action VALUE=Last>');
- writeln(' ');
- writeln('<INPUT TYPE=SUBMIT NAME=Action VALUE=Insert>');
- writeln('<INPUT TYPE=SUBMIT NAME=Action VALUE=Delete>');
- writeln(' ');
- writeln('<INPUT TYPE=SUBMIT NAME=Action VALUE=Find>');
- writeln('<INPUT TYPE=SUBMIT NAME=Action VALUE=Query>');
- writeln(' ');
- writeln('<INPUT TYPE=SUBMIT NAME=Action VALUE=Refresh>');
- end;
- writeln('<INPUT TYPE=RESET VALUE=Reset>');
- writeln('<P>');
- with DataSet do
- begin
- if NewRec then
- writeln('<INPUT TYPE=HIDDEN NAME="',Fields[0].FieldName,'" VALUE="-1">')
- else
- writeln('<INPUT TYPE=HIDDEN NAME="',Fields[0].FieldName,
- '" VALUE="',Fields[0].AsString,'">');
- {$IFDEF DEBUG}
- writeln('<P>');
- writeln('Debug Action: <INPUT TYPE=TEXT NAME=Action>');
- writeln('<P>');
- {$ENDIF}
- writeln('<TABLE BGCOLOR=BBBBBB BORDER><TR>');
- col := 0;
- with TIniFile.Create(IniFile) do
- try
- for i:=1 to FieldCount-1 do { first field was hidden }
- begin
- if Fields[i].DataType = ftMemo then
- begin
- writeln('</TR><TR><TD COLSPAN=3>');
- col := 3;
- end
- else
- if Fields[i].Size > 99 then
- begin
- Inc(col,2);
- if col > 3 then
- begin
- writeln('</TR><TR>');
- col := 2
- end;
- write('<TD COLSPAN=2>')
- end
- else
- begin
- Inc(col);
- if col > 3 then
- begin
- writeln('</TR><TR>');
- col := 1
- end;
- write('<TD>')
- end;
- write('<B>',ReadString(Fields[i].FieldName,'Name',Fields[i].FieldName),'</B><BR>');
- items := ReadInteger(Fields[i].FieldName,'Items',0);
- if items = 0 then
- begin
- if Fields[i].DataType = ftMemo then
- begin
- writeln('<TEXTAREA NAME="',Fields[i].FieldName,'" ROWS=6 COLS=72>');
- if not NewRec then
- writeln(Fields[i].AsString);
- writeln('</TEXTAREA>')
- end
- else
- begin
- if Fields[i].Size > 99 then
- write('<INPUT TYPE=text NAME="',Fields[i].FieldName,'" SIZE=64')
- else
- if Fields[i].Size = 0 then
- write('<INPUT TYPE=text NAME="',Fields[i].FieldName,'" SIZE=30')
- else
- write('<INPUT TYPE=text NAME="',Fields[i].FieldName,'" SIZE=',Fields[i].Size);
- if not NewRec then
- write(' VALUE="',Fields[i].AsString,'"');
- writeln('>')
- end
- end
- else
- begin
- writeln('<SELECT NAME="',Fields[i].FieldName,'">');
- for j:=1 to items do
- begin
- option := ReadString(Fields[i].FieldName,'Item'+Int[j],Int[j]);
- if (not NewRec) and (option = Fields[i].AsString) then { selected }
- writeln('<OPTION SELECTED VALUE="',option,'">',option,' ')
- else
- writeln('<OPTION VALUE="',option,'">',option,' ')
- end;
- writeln('</SELECT>')
- end;
- writeln('</TD>')
- end;
- writeln('</TR>')
- finally
- writeln('</TABLE>');
- Free
- end
- end
- end;
-
- const
- _DatabaseName = ''; { no alias: current directory }
- _TableName = 'report.db';
- Action: String[7] = '';
- var
- Table: TTable;
- Report,i: Integer; { key field }
- NoChange: Boolean;
- begin
- ShortDateFormat := 'DD/MM/YYYY';
- ChDir('data');
- if IOResult <> 0 then { skip };
- writeln('content-type: text/html');
- writeln;
- writeln('<HTML>');
- with TIniFile.Create(IniFile) do
- try
- writeln('<HEAD>');
- writeln('<TITLE>',ReadString(_TableName,'Name',''),'</TITLE>');
- writeln('</HEAD>');
- writeln('<BODY BGCOLOR=AAAAAA>');
- writeln('<CENTER>');
- writeln('<H1>');
- writeln('<IMG SRC="',ReadString(_TableName,'Bitmap',''),'">');
- writeln(ReadString(_TableName,'Name',''));
- writeln('</H1>');
- writeln('<FORM METHOD=POST ACTION="',ReadString(_TableName,'Action',''),'">')
- finally
- Free
- end;
- Table := TTable.Create(nil);
- with Table do
- try
- Active := False;
- TableType := ttParadox;
- DatabaseName := _DatabaseName;
- TableName := _TableName;
- Open;
- { locate current record }
- Report := ValueAsInteger('Report');
- if Report > 0 then FindKey([Report])
- else First;
- { update record if data has changed }
- if (Value('_'+Fields[0].FieldName) <> '') and { old data is stored }
- (ValueAsInteger(Fields[0].FieldName) <> -1) then
- begin
- NoChange := True; { assume no change }
- for i:=0 to FieldCount-1 do
- NoChange := NoChange AND
- (Value('_'+Fields[i].FieldName) = Value(Fields[i].FieldName));
- if not NoChange then { update record }
- begin
- { check if data in table is still the same }
- NoChange := True;
- for i:=0 to FieldCount-1 do
- NoChange := NoChange AND
- (Value('_'+Fields[i].FieldName) = Fields[i].AsString);
- if not NoChange then { table changed!! }
- begin
- writeln('<B>Error: value of record changed before your update was made!</B>');
- Action := 'Refresh' { force refresh }
- end
- else { go ahead! }
- begin
- writeln('<FONT SIZE=2>Note: ');
- Edit; { set Table in Edit-mode }
- for i:=0 to FieldCount-1 do
- begin
- if (Value('_'+Fields[i].FieldName) <> Value(Fields[i].FieldName)) then
- begin
- {$IFDEF DEBUG}
- write(i,' [',Value('_'+Fields[i].FieldName),']-{',Value(Fields[i].FieldName),'} ');
- {$ENDIF}
- Fields[i].AsString := Value(Fields[i].FieldName) { new }
- end
- end;
- Post { Post data in Table };
- writeln(' previous record updated in table</FONT><P>')
- end
- end
- end;
- { determine action }
- if Action = '' then
- Action := Value('Action');
- if Action = '' then Action := 'First';
- { perform action }
- if Action = 'First' then First
- else
- if Action = 'Next' then Next
- else
- if Action = 'Prev' then Prior
- else
- if Action = 'Last' then Last
- else
- if (Action = 'Find') or (Action = 'Query') then
- begin
- // TODO: special query CGI-Form
- end
- else
- if Action = 'Delete' then Delete
- else
- if Action = 'Insert' then { skip }
- else
- if Action = 'Post' then { insert record }
- begin
- First;
- Report := 0;
- while not Eof do
- begin
- if Fields[0].AsInteger > Report then Report := Fields[0].AsInteger;
- Next
- end;
- Inc(Report);
- Insert;
- Fields[0].AsInteger := Report;
- for i:=1 to FieldCount-1 do
- Fields[i].AsString := Value(Fields[i].FieldName);
- Post;
- end
- else
- if Action = 'Cancel' then { cancel }
- else
- { Refresh };
- for i:=0 to FieldCount-1 do
- writeln('<INPUT TYPE=HIDDEN NAME="_',Fields[i].FieldName,
- '" VALUE="',Fields[i].AsString,'">');
- writeln(Fields[0].AsString,' - ',RecNo,'/',RecordCount,' ');
-
- { generate HTML CGI-Form with fields }
- DataSetTable(Table,Action = 'Insert');
- Close
- finally
- writeln('</FORM>');
- writeln('</BODY>');
- writeln('</HTML>');
- Free
- end
- end.
-